home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tango2.lha / SOURCES / sine.s < prev    next >
Text File  |  1988-07-19  |  8KB  |  356 lines

  1.  
  2.     opt c-
  3.     section blitter,code_c            Chip Ram please !!
  4.     include    df1:definitions            Give me some hardware reggies
  5.     include    df1:macros                Give me some macros
  6.     
  7.         
  8. ;LOCAL CONSTANTS
  9.  
  10. icra        equ $bfed01                
  11. allocmem     =-30-168                
  12. freemem     =-30-180                
  13. fontmemory    =4000
  14.  
  15. TAKEOVER:
  16.         
  17.     LEA custom,a5        
  18.     LEA GFXLIB(PC),a1             Point to 'graphics.library'
  19.     MOVEQ #0,D0                     Doesn't matter which version
  20.      MOVE.L 4.w,a6                 EXECBASE
  21.     jsr    -132(a6)                 task switching off (forbid)
  22.      JSR -$228(a6)                  Openlibrary
  23.      MOVE.L D0,GFXBASE             Store library address
  24.  
  25.         
  26. ;Now put the graphic addresses in the CopperList         
  27.  
  28.  
  29.     
  30.      move.l GFXBASE,d0            Move gfxbase offset to d0
  31.      MOVE.L D0,A6                
  32.      MOVE.W #$80,dmacon(a5)        Turn off copper whilst changing it
  33.      MOVE.L $32(A6),WBCOPPER         Store old (WBench) copper address
  34.      MOVE.L #OURCOPPER,$32(A6)    Point to new copper list (our own)
  35.      MOVE.W #$8080,dmacon(a5)    re-enable copper
  36.  
  37.      MOVE.W #$8010,intena(a5)        
  38.      MOVE.L $6c,old                Save work bench interrupt
  39.      MOVE.L #LEV3,$6c            This sets up a level 3 interrupt
  40.     move.w    intenar(a5),systemints
  41.     move.b    #%01111111,icra        Kill keyboard
  42.         
  43. WAIT:     
  44.     BTST #6,$BFE001                This waits for the left
  45.      BNE.S    WAIT                mouse button to be pressed
  46.     move.l    4.w,a6                EXECBASE
  47.      MOVE.L old,$6c                Restore system interrupts
  48.     MOVE.L GFXBASE,A6
  49.      MOVE.W #$80,dmacon(a5)        Disable DMA
  50.      MOVE.L WBCOPPER,$32(A6)        Restore old copperlist
  51.      MOVE.W #$8080,dmacon(a5)    Enable DMA
  52.      move.w    systemints,d0        Systems interrupt
  53.      or.w    #$c000,d0
  54.      move.w    d0,intena(a5)        Enable OS interrupts
  55.      move.b    #%10011011,icra        Enable keyboard
  56.     clr.w    $dff0a8                Clear music
  57.     clr.w    $dff0b8
  58.     clr.w    $dff0c8
  59.     clr.w    $dff0d8
  60.     move.w    #$f,$dff096
  61.     rts
  62.  
  63.  
  64. ERROR:    
  65.     move.l 4.w,a6                Get EXECBASE
  66.     jsr    -138(a6)                Permit ( multi-tasking on )
  67.     moveq    #0,d0                Clear d0
  68.      RTS                            Return to AmigaDOS
  69.  
  70.  
  71. ;This is the NEW level 3 interrupt
  72.  
  73. LEV3:
  74.      MOVEM.L d0-d7/a0-a6,-(sp)    Save all registers to the stack
  75.     lea    custom,a5
  76.     AND #$10,intreqr(a5)           Check if interrupt is from Copper 
  77.     BNE out
  78.     move.w    #$8010,$9c                    
  79.     bsr    try_sin
  80.     bsr    scroll
  81.      move.l    sin_screen,d1        Bitplane memory address
  82.     move.w    d1,bp1lo+2
  83.      swap    d1
  84.      move.w    d1,bp1hi+2
  85.  
  86. out:     
  87.     MOVEM.L (sp)+,d0-d7/a0-a6    Restore the registers
  88.     DC.W $4ef9                    hex value for  JMP instruction
  89. old:     
  90.     DC.L 0                        will jump to normal interrupt
  91. Buff
  92.     Eor.l    #10240,Tango
  93.     Move.l    Tango,D1
  94.     Move.l    #SinePlane,d2
  95.     Add.l    D1,d2
  96.     Move.l    D2,Sin_Screen
  97.     Rts
  98. ; ** THE SCROLL ROUTINE **
  99.  
  100. scroll
  101.     cmp.l    #15*4,val                Blitshifted all <<<
  102.     blo.s    coarse_scroll_it        No then get doing it !!
  103.     bsr        blit_char                Blit letter to screen
  104.     clr.l    val                        Reset index
  105. coarse_scroll_it:
  106.     bsr        coarse                    Scroll all line
  107.     rts                            
  108.     
  109.     
  110. ; ** BLIT LETTER ON THE SCREEN **
  111.  
  112. blit_char
  113.     jsr        text
  114.     lea        custom,a5                Get custom chip address
  115.     move.l    screenx,a0                 Can~t see this picture !!
  116.     move.l    #font,a1                 Put font in blitter source
  117.     add.l    d1,a1
  118. blit_test:
  119.     btst    #14,$dff002                 Blitter busy !!!
  120.     bne    blit_test                     Lets wait till she finishes !
  121.     move.w    #$ffff,bltafwm(a5)        Mask (DON'T NEED ONE)
  122.     move.w    #$ffff,bltalwm(a5)        Mask (DON'T NEED ONE)
  123.     move.l    a0,bltdpth(a5)             Blitter dest D (BOTTOM OF SCREEN)
  124.     move.l    a1,bltapth(a5)             Blitter source A (SCROLLING FONT)
  125.     move.w    #38,bltamod(a5)             Modulo (20-1)*2
  126.     move.w    #38,bltdmod(a5)             Modulo (20-1)*2
  127.     move.w    #$9f0,bltcon0(a5)         Minterms D=A
  128.     clr.w    bltcon1(a5)                 Set Ascending mode
  129.      move.w    #16*64+1,bltsize(a5)     Blit size (SIZE OF FONT)
  130.     rts                                  Return
  131.  
  132.  
  133. ; ** BLITSHIFT THE ENTIRE SCROLL LINE (BETTER THAN USING THE HARDWARE).
  134.  
  135. coarse:
  136.     lea        custom,a5                 
  137.     move.l    screenx,a0                ; Can~t see this picture !!
  138.     move.l    a0,a1
  139.     add.l    #2,a1
  140. blit_wait:
  141.     btst    #14,$dff002            
  142.     bne        blit_wait
  143.     incl    #4,val                    ; (1 for slower)
  144.     move    #15,d7                    ; Amount of pixels to shift(15 for slow)
  145.     ror        #4,d7                    ; Set to correct bits (12-15)
  146.     or        #%100111110000,d7        
  147.     move.l    #-1,bltafwm(a5)
  148.     move.l    a1,bltapth(a5)
  149.     move.l    a0,bltdpth(a5)
  150.     move.w    #0,bltamod(a5)
  151.     move.w    #0,bltdmod(a5)
  152.     move.w    d7,bltcon0(a5)    
  153.     move.w    #80*64+20,bltsize(a5)
  154.     rts    
  155.  
  156.  
  157. ; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **
  158.  
  159. CLEAR:
  160.     Move.l    Sin_Screen,a0
  161. wate
  162.     btst    #14,$dff002
  163.     bne.s    wate
  164.     Move.l    a0,Bltdpth(a5)
  165.     Move    #0,Bltdmod(a5)
  166.     Move.l    #$1f00000,Bltcon0(a5)
  167.     Move    #150*64+20,Bltsize(a5)
  168.     Rts
  169.  
  170.  
  171.  
  172. try_sin:
  173.     Bsr        buff
  174.     bsr        clear
  175.     Move.l    Table1,A3
  176.     Move.b    (A3),d1
  177.     Cmp.b    #$ff,d1
  178.     Bne        ItsOkYa
  179.     Move.l    #SinTab,A3
  180. ItsOkYa
  181.     Add.l    #2,A3
  182.     Move.l    a3,Table1
  183.     Move.l    A3,Table
  184.     lea        custom,a5                 
  185.     move.l    screenx,a0                 ; Source A
  186.     move.l    #20,d4                    ; Number of chars along screen
  187.     clr.l    d5
  188.     clr.l    d6
  189. ban:
  190.     move.w    #%1000000000000000,d3
  191.     move.l    #15,d2
  192. blit_test0:
  193.     btst    #14,$dff002                 
  194.     bne    blit_test0                     
  195.     move.l    sin_screen,a1
  196.     bsr        get_sinvalue
  197.     move.w    d3,bltafwm(a5)        
  198.     move.w    d3,bltalwm(a5)        
  199.     move.l    a1,bltdpth(a5)             
  200.     move.l    a1,bltbpth(a5)             
  201.     move.l    a0,bltapth(a5)             
  202.     move.w    #38,bltamod(a5)             
  203.     move.w    #38,bltdmod(a5)             
  204.     move.w    #38,bltbmod(a5)             
  205.     move.w    #$dfc,bltcon0(a5)         
  206.     clr.w    bltcon1(a5)                 
  207.      move.w    #16*64+1,bltsize(a5)     
  208.     lsr.w    #1,d3
  209.     dbf        d2,blit_test0
  210.     add.l    #2,a0                    ; Get next letter along
  211.     add.l    #2,d6
  212.     dbf        d4,ban
  213.     rts                                  
  214.  
  215. get_sinvalue:
  216.     Clr.l    D5
  217.     Move.l    Table,A3
  218.     Move.b    (A3),d5
  219.     cmp.b    #$ff,d5
  220.     bne        aslam
  221.     Move.l    #SinTab,A3
  222.     Move.b    (a3),d5
  223. Aslam
  224.     Add.l    #$1,A3
  225.     Move.l    A3,Table
  226.     mulu    #40,d5
  227.     add.l    d5,a1
  228.     Add.l    D6,A1
  229.     rts
  230. Table1:    Dc.l    SinTab    
  231. table:    dc.l    sintab
  232. sintab:
  233.  
  234.  
  235.     dc.b        19,20,22,23,25,26,28,29,31,32,34,35
  236.     dc.b        37,38,39,41,42,44,45,46,48,49,50,52
  237.     dc.b        53,54,55,57,58,59,60,61,63,64,65,66
  238.     dc.b        67,68,69,70,71,72,73,74,75,75,76,77
  239.     dc.b        78,79,79,80,81,82,82,83,83,84,85,85
  240.     dc.b        86,86,87,87,87,88,88,88,89,89,89,89
  241.     dc.b           90,90,90,90,90,90,90
  242.     dc.b        89,89,89,89,88,88,88,87,87,87,86,86
  243.     dc.b        85,85,84,83,83,82,82,81,80,79,79,78
  244.     dc.b        77,76,75,75,74,73,72,71,70,69,68,67
  245.     dc.b        66,65,64,63,61,60,59,58,57,56,55,54,53
  246.     dc.b        52,50,49,48,46,45,44,42,41,39,38,37
  247.     dc.b        35,34,32,31,29,28,26,25,23,22,20,19,19,19,19,19
  248.     dcb.b         10,255
  249.  Even
  250.  
  251. ; ** CHARACTER DECODER ROUTINE **
  252.  
  253. text:
  254.     move.l    acurent,a2                Get message
  255.     clr.l    d1                        
  256.     move.b    (a2)+,d1                Update it
  257.     move.b    d1,letter                Store in offset
  258.     cmp.b    #255,d1                    Check for end of message
  259.     beq.w    rst_text                If equal, then reset
  260.     sub.l    #32,d1                    Subract 32 (ie space)
  261.     asl        d1                        Times by 2 
  262.     move.l    a2,acurent                Update acurent
  263.     CMP.B    #"4",letter                Is letter "K" or larger
  264.     BPL.s    add_more                If larger then add on
  265.     rts                                Return
  266. add_more:
  267.     CMP.B    #"H",letter                Is letter "U" or larger
  268.     BPL.S    add_more2                If larger then add on
  269.     add.l    #40*15,d1                Get next line down (KLMNOPQRST)
  270.     rts
  271. add_more2:                    
  272.     add.l    #40*30,d1                Get next line down (UVWXYZ0123)
  273.     rts
  274. rst_text:
  275.     move.l    #0,d1
  276.     move.l    #message,d2                Get begining of text
  277.     move.l    d2,acurent                Reset to begining
  278.     rts                                Return
  279.  
  280.  
  281. message:
  282.  
  283. ; *=FACE    
  284.  
  285.     DC.B    "TANGO OF CRYPTIC UK PRESENTS A SMALL INTRO NO WAY NEAR"
  286.     DC.B    " FINISHED.    "
  287.     DC.B    255
  288.     EVEN
  289.             
  290.  
  291. ; ** THE COPPERLIST **
  292.  
  293. OURCOPPER:
  294.         dc.w    $120,0
  295.         dc.w    $122,0
  296.         dc.w    bpl1mod,0,bpl2mod,0
  297.         dc.w    diwstrt,$2c81,diwstop,$2cc1
  298.         dc.w    bplcon0,$1200,bplcon1,$0000
  299.         dc.w    ddfstrt,$38,ddfstop,$d0
  300.         dc.w    color00,$fff,color01,$0000
  301. bp1lo:    dc.w    bpl1ptl,$0000 
  302. bp1hi:    dc.w    bpl1pth,$0000
  303.         end_copper
  304.         
  305.  
  306. ;LOCAL CONSTANTS
  307.  
  308. WBCOPPER:        DC.L    0
  309. GFXLIB:            DC.B     "graphics.library",0
  310. GFXBASE:        DC.L    0
  311. systemints:        dc.l    0
  312. scroll_offset:    dc.l    0
  313. screenx:        dc.l    picture
  314. letter:            dc.b    0
  315. acurent:        dc.l    message
  316. val:            dc.l    0
  317.  
  318.  
  319. ;BINARY FILES TO BE INCLUDED
  320.     EVEN
  321. picture    
  322.     dcb.b    10240,0
  323. Tango    Dc.l    0
  324. sin_screen:
  325.     Dc.l        SinePlane
  326. SinePlane
  327.     dcb.b    10240,0
  328.     dcb.b    10240,0
  329. font
  330.     incbin    df1:neatfont.bin
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.     
  339.     
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.     
  348.     
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.